Amazon QuickSightで分析のシートを別の分析にコピーする
データアナリティクス事業本部インテグレーション部機械学習チーム・新納(にいの)です。
Amazon QuickSightではアセット定義を取得し、API経由でCreate/Updateできる機能があります。
Amazon QuickSight でダッシュボード、分析、テンプレートをコード管理出来るようになりました #reInvent | DevelopersIO
この機能を使って、分析のシートを別の分析にコピーしてみました。
やりたいこと
以下の条件で検証しました。
- 分析(analysis1)のシート2を別の分析(analysis2)へコピー
- analysis1とanalysis2のデータセットはそれぞれ別のものを使用している
- API操作はCloudShellから実施
全体の流れは以下の通り。
- コピー元(analysis1)・コピー先(analysis2)の両方の分析の定義を取得
- コピーしたいシートの定義をコピー先(analysis2)の定義に貼り付け、アカウント情報などのその他必要情報を編集
- 編集した定義を使って
update-analysis
コマンドでコピー先(analysis2)を更新
定義を取得する
まずはコピー元・コピー先の定義を取得します。分析のIDが必要となるのでQuickSightのコンソールから「QuickSightを管理」にアクセスし、アセット管理画面から確認します。
定義の取得にはdescribe-analysis-definition
コマンドを使います。AWSアカウントIDと分析のIDを指定し、jsonファイルにして出力内容を保存します。コピー元・コピー先の分析の両方の定義をこのコマンドで取得しておきましょう。
aws quicksight describe-analysis-definition \
--aws-account-id <AWSアカウントID> \
--analysis-id <分析ID> \
> ./<任意のファイル名>.json
今回はAWSマネジメントコンソールからCloudShellを使ってコマンド実行しています。上記のコマンドで保存されたJSONファイルは、アクション→ファイルをダウンロードでファイル名を指定することでダウンロード可能です。
定義を編集する
シートの定義をコピー
コピーしたいシートの定義情報をコピー元の分析定義から抜き出し、コピー先の定義ファイルへ貼り付けます。一部抜粋とはなりますが、分析の定義情報は以下のようになっています。シートの定義はSheets
キーの中に定義されています。このJSONファイルはなかなか長いので目的部分を見つけるのは一苦労ですが、対象となるシート2のSheetId
,Name
,Visuals
,Layouts
,ContentType
の要素をコピーできれば十分です。
{
"Status": 200,
"AnalysisId": "9b6a4721-41bc-410b-b77e-21cc2497e606",
"Name": "analysis1",
"ResourceStatus": "CREATION_SUCCESSFUL",
"Definition": {
"DataSetIdentifierDeclarations": [
{
"Identifier": "dataset1",
"DataSetArn": "<データセットのARN>"
}
],
"Sheets": [
{
"SheetId": "ffe1e897-4b09-4c18-a38f-796066d94d16",
"Name": "シート 1",
"Visuals": [
...(中略)...
],
"Layouts": [
...(中略)...
],
"ContentType": "INTERACTIVE"
},
{
"SheetId": "200a02b7-bcfb-4af3-a082-cfed1a7b7ac1",
"Name": "シート2",
"Visuals": [
...(中略)...
],
"Layouts": [
...(中略)...
],
"ContentType": "INTERACTIVE"
}
:
:
:
コピーしたシート定義をコピー先の分析定義のSheets
キーの要素の中にに貼り付けます。シートの要素を区切るカンマをお忘れなく。
データセット定義を追加
今回はコピー元の分析で使っているデータセットとコピー先で使っているデータセットが異なります。この場合は、データセットの定義部分に追加する必要があります。QuickSightのコンソール画面からデータセットを手動で追加するのと同じイメージです。コピー元分析とコピー先分析で同じデータセットを使用している場合はこの手順は必要ありません。
データセット定義はDataSetIdentifierDeclarations
要素の中にあり、データセット名のIdentifier
とデータセットARNのDataSetArn
から構成されています。。今回はこの中にdataset1を追加しました。
分析情報の編集
describe-analysis-definition
コマンドで定義情報を取得すると、定義をエクスポートした際のステータスやリクエストIDなどの情報が付与されています。このままでは後述するupdate-analysis
コマンドで分析を更新するときのインプットとして利用できません。
"Status": 200,
...(中略)...
"ResourceStatus": "CREATION_SUCCESSFUL",
...(中略)...
"RequestId": "cd17f332-6780-4674-a0ec-938273681d01"
上記のStatus
、ResourceStatus
、RequestId
を削除し、AwsAccountId
を追加しましょう。
分析を更新する
ここまで準備ができたらあとは分析を更新するだけです。前項で編集したjson形式の定義ファイルを指定してupdate-analysis
コマンドを実行します。
今回はCloudShellを使ってコマンド実行をするため、アクションから「ファイルのアップロード」を選択し、定義ファイルをカレントディレクトリに配置します。
ls
コマンドでファイルの存在を確認できました。
--cli-input-json
に定義ファイルを指定し、updateコマンドを実行します。
aws quicksight update-analysis --cli-input-json file://./<定義ファイル名>
実行するとリクエストに対するレスポンスが返ってきます。
コピー先の分析をコンソール上から見てみると、シートが追加されていることが確認できました。
データセットも無事に追加されていることが確認できます。
最後に
コードベースでシートを別の分析にコピーする方法をご紹介しました。生のJSONファイルを編集する必要があるのが難点ではありますが、特に手動での再作成に手間がかかる複雑な分析をそのままコピーできるのはうれしいポイントです。